
/****js this用法BEGIN******/
var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); 
            console.log(this); 
        }
    }
}
var j = o.b.fn;
//this代表函数的调用者(这里是全局变量window)
j(); //this: window, this.a undefined
var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //12
        }
    }
}
o.b.fn(); //这里调用者为b
//用于构造函数
function Fn(){
    this.user = "追梦子";
}
var a = new Fn(); //this代表被赋值的变量
console.log(a.user); //追梦子
// this 在执行时确定，other在定义时确定
var name = "The Window";
var object = {
    name : "My Object",
    getNameFunc : function(){
        return function(){
            return this.name;
        };

    }
};
//this所在函数作为window的属性被调用
//全局变量window的window属性指向自己
alert(object.getNameFunc()()); //The Window
//-------
var name = "The Window";
var object = {
    name : "My Object",
    getNameFunc : function(){
        var that = this;
        return function(){
            return that.name;
        };

    }
};
// this 在执行时确定，other在定义时确定
// that指向this， this 指向 object
alert(object.getNameFunc()()); // "My Object"
//被隐式调用(回调函数, 嵌套函数，匿名函数)的函数, this 指向window
function f1() {
    function f2() { 
        function f3() { 
            console.log(this); 
        } 
        f3(); 
        console.log(this); 
    } 
    f2(); 
    console.log(this); 
}
f1(); //window*3
var  ff = { f: f1};
ff.f(); //window*2, ff
var a = { b: function() { 
    var func = function() { 
        console.log(this.c); 
        console.log(this); } 
    func(); 
    }, 
    c: 'hello' 
} a.b(); // undefined 这里的this指向的是全局作用域 
/****js this用法END******/
/****js 修改this指向******/
var a = {
    b: function() {
        var _this = this; // 通过赋值的方式将this赋值给that
        var func = function() {
            console.log(_this.c);
        }
        func();
    },
    c: 'hello'
}
a.b(); // hello
// 使用bind方法一
var a = {
    b: function() {
        var func = function() {
            console.log(this.c);
        }.bind(this);
        func();
    },
    c: 'hello'
}
a.b(); // hello
// 使用bind方法二
var a = {
    b: function() {
        var func = function() {
            console.log(this.c);
        }
        func.bind(this)();
    },
    c: 'hello'
}
a.b(); // hello
